/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package obiekty;

import java.awt.Image;
import javax.swing.ImageIcon;
import utils.Vector2D;
import zachowania.ZachowaniaSterujace;
import zachowania.gracz.StanGracza;
import zachowania.gracz.Stoj;

/**
 *Klasa odpowiedzialna za obsługę całej logiki związanej z graczem - jego ruchami
 * działaniami, oraz reakcjami na otoczenie
 * @author m
 */
public class Gracz extends ObiektRuchomy
{

    ZachowaniaSterujace zachowania;
    StanGracza stanGracza;
    Vector2D idzDo;
    Vector2D cel;
    private long elapsedTime;
    private int liczbaRakiet;
/**Konstruktor
 * @param image - Sprite przedstawiający gracza
 * 
 */

    public Gracz(Image image)
    {
        super(image);
        zycie = 100;
        liczbaRakiet = 10;
        maxZycie = zycie;
        stanGracza = new Stoj();
        zachowania = new ZachowaniaSterujace();
    }
/**
 * Metoda aktualizująca pozycję gracza i odpowiedzialna za logikę
 * @param elapsedTime - czas od ostatniej aktualizacji
 */

    @Override
    public void update(long elapsedTime)
    {
        //if (stanGracza instanceof Stoj == false)
        // {
        //     usunKolizje();
        // }
        this.elapsedTime = elapsedTime;
        stanGracza.wykonaj(this);
    }
/**
 * Metoda zajmujaca sie zmiana stanu gracza - zmiana zachowan sterujacych
 * @param nowy - nowe zachowanie sterujące gracza
 */

    public void zmienStan(StanGracza nowy)
    {
        stanGracza = nowy;
    }

    /**
 * Metoda powodująca wystrzelenie pocisku w kierunku celu
     * @param target - cel strzału
 */

    public final PociskBolter shootAt(Vector2D target)
    {
        PociskBolter pb = new PociskBolter(new ImageIcon("bolterRound.gif").getImage(), target, this.pozycja.add(this.orientacja.multiple(this.promien + 3)), this.orientacja);
        return pb;

    }
   /**
 * Metoda powodująca wystrzelenie pocisku w kierunku celu
     * @param target - cel strzału
 */ 
    public final Rakieta sendrocketAt(Vector2D target)
    {Rakieta pb;
        if (liczbaRakiet>0){
         pb = new Rakieta(new ImageIcon("bolterRound.gif").getImage(), target, this.pozycja.add(this.orientacja.multiple(this.promien + 3)), this.orientacja);
        liczbaRakiet--;
        return pb;
     }
     pb = null;
     return pb;
    }
/**
 * Metoda wywołująca przesuwanie gracza w kierunku celu
 * @return sprawdza czy osiągnięto cel
 */

    public boolean idzDoPunktu()
    {
        zachowania.seekOn();
        zachowania.obstacleAvoidanceOn();
        wyliczPrzesuniecie(zachowania.calculate(this, idzDo));
        if (pozycja.subtract(idzDo).length() < 1.0)
        {
            przesunObiekt(idzDo);
            //pozycja.x = idzDo.x;
            //pozycja.y = idzDo.y;
            return true;
        }
        return false;
    }
/**
 * Kasowanie celu marszu
 */

    public void wyczyscPunktIdzDo()
    {
        idzDo = null;
    }
/**
 * Sprawdzenie czy jest wybrany jakiś cel marszu
 * @return czy istnieje cel marszu
 */

    public boolean obranoPunktIdzDo()
    {
        return idzDo == null ? false : true;
    }
/**
 * Ustawienie celu marszu
 * @param v - punkt docelowy
 * 
 */

    public void setIdzDo(Vector2D v)
    {
        idzDo = v;
    }
/**Funkcja wylicza o jaki wektor należy przesunąć sprite'a gracza.
 * @param steeringForce - siła sterująca
 * 
 */

    private void wyliczPrzesuniecie(Vector2D steeringForce)
    {
        sila = steeringForce;
        if (sila.length() != 0.0)
        {
            predkosc = predkosc.add((sila.divide(masa).multiple(elapsedTime)));
            predkosc = predkosc.cutTo(maxPredkosc);
            if (predkosc.length() > 0.001)
            {
                orientacja = predkosc.normalize();
            }
        } else
        {
            predkosc.x = 0;
            predkosc.y = 0;
        }
        przesunObiekt(pozycja.add(predkosc.multiple(elapsedTime)));
    //pozycja = pozycja.add(predkosc.multiple(elapsedTime));

    }

    @Override
    public Object clone()
    {
        return new Gracz(image);
    }
}
